import koa from 'koa'
import MockRouter from './router/mock' // 本地mock数据
import AdminRouter from './router/admin' // 后台管理的接口
import UserRouter from './router/user' //用户管理接口
import koaBody from 'koa-body' // 处理post请求和文件上传
import cors from 'koa-cors'

let app = new koa

import {Server} from 'http'
// 配置跨域
app.use(cors())

// 配置日志信息
import { accessLogger,httpLogger,formatText, bindConsoleToLogger } from './until/log'
// 将 console 输出绑定到文件日志，确保在 exe 以及 Electron 启动时也能正常落盘
bindConsoleToLogger()
app.use(accessLogger())
app.use(koaBody())

// 监听应用程序接口
app.use(async (ctx,next) => {
    const start:any = new Date();					              // 响应开始时间
    let intervals								                 // 响应间隔时间
    try {
        await next();
        intervals = new Date() as any - start;
        httpLogger.info(formatText.response(ctx, intervals))	   //记录响应日志
    } catch (error) {
        intervals = new Date() as any - start;
        httpLogger.error(formatText.error(ctx,error,intervals))    //记录异常日志
    }
})

// 本地mock数据中间件
app.use(MockRouter.routes())
app.use(MockRouter.allowedMethods())

// 后台管理的中间件
app.use(AdminRouter.routes())
app.use(AdminRouter.allowedMethods())

// 用户管理的中间件
app.use(UserRouter.routes())
app.use(UserRouter.allowedMethods())

const run = (port:number | string):Server => {
    app.on("error",(err) => {
        console.log("错误")
    })
    return app.listen(port,() => {
        console.log("http://127.0.0.1:"+ port +" is running")
    }).on("error",(err) => {
        console.log("程序错误：" + err)
    })
}

export default run